package com.hc.springbootredis.common;

public class RedisHelper {
    /**
     *  -----CAP-----
     *      C:强一致性
     *      A:高可用性
     *      P:分区容错性
     *  -----安装-----
     *      1.上传压缩包
     *      2.解压tar -zxvf redis-xxx.gz
     *      3.查看是否有gcc，没有则安装gcc -v，yum -y install gcc
     *      4.进入Redis安装目录编译make
     *      5.安装make install
     *  -----基本操作-----
     * 1.配置可后台运行
     *      vim /redisxxx/redis.conf
     *      daemonize yes
     * 2.启动
     *      cd /usr/local/bin
     *      redis-server /redisxxx/redis.conf
     * 3.关闭
     *      redis-cli shutdown
     *      redis-cli -p 6379 shutdown
     * 4.查看端口占用
     *      netstat -lntp | grep 6379
     *      ps -ef | grep redis
     * 5.Redis伪终端连接或退出
     *      /usr/local/bin/redis-cli
     *      exit
     * 6.增删改查
     *      set key1 hello
     *      get key1
     *      set key1 world
     *      del key1
     * 7.key模糊查询
     *      通配符: 任意:*   一个:?  某个或些:[]
     *      1)查所有键:keys *
     *      2)查k开头:keys k*
     *      3)查k结尾:keys *k
     *      4)查k开头并匹配一个字符:keys k?
     *      5)查可能的:keys k[ea]y
     * 8.key操作
     *      默认库0~15
     *      1)某个key是否存在:exists key1
     *      2)切换库:select 3
     *      3)移动键:move key1 2
     *      4)查看键多久过期:ttl key1
     *      5)设置键过期时间:expire key1 60
     *      6)查看键的数据类型:type key1
     * -----Redis集群-----
     *      假设 主:192.168.194.100 从:192.168.194.101  从:192.168.194.102
     *      1)编辑:vim /opt/redis-5.0.4/redis.conf
     *      2)修改:bind 0.0.0.0
     *      3)启动:redis-server /opt/redis-5.0.4/redis.conf
     *      4)设置成为谁的子节点:slaveof 192.168.194.100 6379
     *      5)查看信息:info replication
     *      6)设置从节点成主节点:slaveof no one
     *      7)关闭保护模式 允许java调用:vim /opt/redis-5.0.4/redis.conf
     *                              protected-mode no
     * -----主从复制原理-----
     *      1.从节点连接主节点，并发送同步请求
     *      2.主节点开启存盘进程，收集写指令
     *      3.主节点发送快照给从节点
     *      4.从节点执行快照指令
     *      策略：主从刚连接时，进行全量复制，后续再进行增量复制，如果增量复制失败，从节点再进行全量复制
     * -----哨兵模式-----
     *      监控主从节点，出现故障时选择新的主节点并将所有从节点连接到新主节点
     *      1)哨兵配置:
     *           编辑:vim /usr/local/bin/sentinel.conf
     *           输入:sentinel monitor redis1 192.168.194.100 6379 1
     *      2)哨兵启动:cd /usr/local/bin , redis-sentinel sentinel.conf
     * -----Key生存时间-----
     *      1）定期删除：Redis每隔一段时间查看过期的key
     *      2）惰性删除：每次查询到key时查看过期时间，若过期，则删除并返回空值
     * -----淘汰机制-----
     *      1）设置了生存时间的最近最少使用的(最近一次访问时间)
     *      2）最近最少使用的
     *      3）设置了生存时间的最近最少频次使用的(最近一段时间内最少次数)
     *      4）最近最少频次使用的
     *      5）设置了生存时间的随机一个
     *      6）随机一个
     *      7）设置了生存时间的剩余时间最少的
     *      8）直接报错
     * -----缓存问题-----
     *      1)缓存穿透:频繁的请求查Redis,但Redis又查不到,导致请求查数据库,数据库可能会崩掉
     *          1.1)缓存空对象:给Redis缓存空值并设置过期时间
     *          1.2)布隆过滤器:缓存不存在的id至过滤器，下次请求直接返回空
     *          1.3)白名单:不在白名单的请求的拦截
     *          1.4）参数校验：对请求增加类似token的参数校验
     *      2)缓存击穿:频繁的请求查Redis,但Redis已过期且未删除,导致请求查数据库,数据库可能会崩掉
     *          2.1)预设:提前把热门数据存入Redis并加大过期时间
     *          2.2)分布式锁
     *      3)缓存雪崩:同一时间大量缓存失效，导致请求查数据库，数据库可能会崩掉
     *          3.1）搭建集群
     *          3.2）限流降级
     *          3.3）搭建多级缓存架构
     *          3.4）增加随机失效时间
     * -----面试题-----
     * 1.如何防止重复下单
     *      1）前端控制点击后不可再次点击
     *      2）通过Redis的setNx去保证,无值则保存成功返回true，有值则保存失败返回false
     * 2.Redis6为何引入多线程
     *      1）提升网络处理效率,6.0之前网络也是单线程处理的，可能会限制整体吞吐量
     *      2）并行处理网络请求，降低延迟
     * 3.如何处理热Key问题
     *      1）使用本地缓存，如Caffeine,GuavaCache
     *      2）拆分成子key
     *      3）限流
     *      4）集群扩容
     * 4.如何处理大Key问题
     *      1）大集合拆分成多个小集合
     *      2）数据压缩
     *      3）开启惰性删除
     *      4）使用scan批量扫描key
     * 5.缓存与数据库双写不一致问题
     *      1）使用分布式锁
     *      2）使用canal中间件异步更新缓存
     *      3）更新后设置合理过期时间
     *      4）先更新缓存，再更新数据库
     *         先更新数据库，再更新缓存
     *         先删除缓存，再更新数据库
     *         先更新数据库，再删除缓存
     * 6.Key和Value设计原则
     *      Key
     *      1）短小精炼
     *      2）使用命名空间
     *      3）避免热Key
     *      4）全局唯一并结合业务逻辑
     *      Value
     *      1）选择合适的数据结构类型
     *      2）限制Value大小，进行拆分或压缩
     *      3）合理使用过期时间
     * 7.如何安全高效遍历所有Key
     *      1）使用scan命令批量遍历
     * 8.Redis是单线程还是多线程
     *      6.0之前：网络请求，读写是单线程的，持久化，集群数据同步则由额外的线程执行
     *      6.0及后：网络请求是多线程的，别的不变
     * 9.Redis单线程为何还这么快
     *      1）命令基于内存
     *      2）命令执行是单线程，没有线程切换开销
     *      3）基于IO多路复用机制(Linux的epoll机制)
     *      4) 高效的数据存储结构：全局哈希表（1维数组+2维链表）
     * 10.跳表存储是什么
     *      1）将有序链表改造成近似”折半查找“的方式
     * 11.Redis集群数据hash分片算法
     *      1）Redis将所有数据分为16384个槽位
     *      2）假设有3个主从节点，对应槽位1-5000，5001-10000，10001-16384
     *      3）计算key的hash槽位值并存储在对应槽位的节点上
     * 12.Redis持久化RDB和AOF区别
     *      RDB
     *      1）基本原理:fork子进程，将内存快照数据写入文件中，写入成功后用这个文件替换快照文件
     *      2) 触发机制：save同步阻塞请求，bgsave异步写时复制
     *      3）优点：大规模且恢复，且数据恢复完整性不敏感，RDB更高效；适合全量备份
     *      4）缺点：内存翻倍；可能会丢失最后一次快照数据
     *      AOF
     *      1）基本原理：每个写命令都将被以追加的方式记录在文件中
     *      2）触发机制：可配置每次数据修改都写入文件；每秒同步一次；有操作系统控制
     *      3）优点：数据安全性更高；不影响客户端读写
     *      4）缺点：文件过大时恢复速度慢；需定期进行AOF重写
     *      混合持久化(基于AOF)
     *      1）基本过程：重写前，先对内存做RDB快照处理，将快照内容和增量AOF修改一起存入文件中
     * 13.Redis集群支持批量操作命令吗
     *      1）支持，但所有key的需落在同一个槽位上，对所有key增加相同的哈希Tag
     * 14.Lua脚本能在集群里执行吗
     *      1）Lua脚本：Redis命令集合
     *      2）支持，但所有key的需落在同一个槽位上，对所有key增加相同的哈希Tag
     */
}
